package com.example.day07;

import com.example.config.ConstantEnumIFace;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author jeff
 * 第一个T，表示这个TypeHandler只为实现ConstantEnumIFace的类做数据转换
 * 第二个T，表示ConstantEnumIFace接口中的方法，返回的类型为T
 * 第三个T，表示这个TypeHandler只为T类型数据做数据转换
 */
public class ConstantEnumsTypeHandler<T extends ConstantEnumIFace<T>> extends BaseTypeHandler<T> {

    public ConstantEnumsTypeHandler(Class<T> tClass){
        theEnums =tClass.getEnumConstants()[0];
    }

    private T theEnums;

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
        ps.setInt(i, parameter.getValue());
    }

    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        int i =rs.getInt(columnName);
        if (0==i && rs.wasNull()) return null;
        return getValue(i);
    }

    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        int i =rs.getInt(columnIndex);
        if (0==i && rs.wasNull()) return null;
        return getValue(i);
    }

    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        int i =cs.getInt(columnIndex);
        if (0==i && cs.wasNull()) return null;
        return getValue(i);
    }

    T getValue(int value){
        return theEnums.theEnum(value);
    }
}
